﻿using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class AppHotKey
{
    [DllImport("kernel32.dll")]
    public static extern uint GetLastError();
    //如果函数执行成功，返回值不为0。
    //如果函数执行失败，返回值为0。要得到扩展错误信息，调用GetLastError。
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool RegisterHotKey(
        IntPtr hWnd,                //要定义热键的窗口的句柄
        int id,                     //定义热键ID（不能与其它ID重复）          
        KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
        Keys vk                     //定义热键的内容
        );

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool UnregisterHotKey(
        IntPtr hWnd,                //要取消热键的窗口的句柄
        int id                      //要取消热键的ID
        );

    //定义了辅助键的名称（将数字转变为字符以便于记忆，也可去除此枚举而直接使用数值）
    [Flags()]
    public enum KeyModifiers
    {
        None = 0,
        Alt = 1,
        Ctrl = 2,
        Shift = 4,
        WindowsKey = 8
    }
    /// <summary>
    /// 注册热键
    /// </summary>
    /// <param name="hwnd">窗口句柄</param>
    /// <param name="hotKey_id">热键ID</param>
    /// <param name="keyModifiers">组合键</param>
    /// <param name="key">热键</param>
    public static void RegKey(IntPtr hwnd, int hotKey_id, KeyModifiers keyModifiers, Keys key)
    {
        try
        {
            if (!RegisterHotKey(hwnd, hotKey_id, keyModifiers, key))
            {
                if (Marshal.GetLastWin32Error() == 1409) { MessageBox.Show(key.ToString() + "热键被占用 ！"); }
                else
                {
                    MessageBox.Show("注册热键失败！");
                }
            }
        }
        catch (Exception) { }
    }
    /// <summary>
    /// 注销热键
    /// </summary>
    /// <param name="hwnd">窗口句柄</param>
    /// <param name="hotKey_id">热键ID</param>
    public static void UnRegKey(IntPtr hwnd, int hotKey_id)
    {
        //注销Id号为hotKey_id的热键设定
        UnregisterHotKey(hwnd, hotKey_id);
    }

}